package com.atguigu.juc.juc_3utils;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * @Author yanglin [2533188365@qq.com]
 * @Create 2024-04-26 17:05
 * @Description:
 */
public class CyclicBarrierDemo {


    /**
     * CyclicBarrier让一组线程达到一个屏障（也可以叫同步点）时被阻塞，直到最后一个线程达到屏障时，屏障才会开门，
     * 所有被屏障拦截的线程才会继续干活。
     */

    public static void main(String[] args) {

        //parties指定参与等待的线程数，barrierAction一个可选的Runnable命令，该命令只在每一个屏障点运行一次，可以在执行后续的业务之前共享状态
        //该操作由最后一个进入屏障点的线程执行。
        CyclicBarrier cyclicBarrier = new CyclicBarrier(6,() -> {
            System.out.println("人齐了才开会");
        });

        for (int i = 0; i < 18; i++) {
            //防止打印时乱序
            try {
                TimeUnit.MILLISECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            new Thread(() -> {
                //由最后到达await方法的线程执行打印的
                System.out.println("第" + Thread.currentThread().getName() + "人到了");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }
            },String.valueOf(i)).start();
        }

    }


}
